#ifndef AD_EXCEPTION_H_
#define AD_EXCEPTION_H_
#include <stdexcept>
#include <string>

// Base exception class
class AdException : public std::exception {
 public:
  explicit AdException(const char* what) noexcept;
  explicit AdException(std::string const& what) noexcept;
  explicit AdException(std::string&& what) noexcept;
  ~AdException() noexcept = default;
  AdException(AdException const&) noexcept = default;
  AdException& operator=(AdException const&) noexcept = default;
  AdException(AdException&&) noexcept = default;
  AdException& operator=(AdException&&) noexcept = default;

  const char* what() const noexcept override;

 private:
  ///@brief Exception message
  std::string msg_;
};

#endif  // !AD_EXCEPTION_H_